home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 4 / FM Towns Free Software Collection 4 - Disc 1.iso / pao / towns / paolib / vsync.asm < prev    next >
Assembly Source File  |  1991-10-18  |  10KB  |  375 lines

  1. ;==============================================================================
  2. ;    << 386ASM V2.0 >>  for  FM TOWNS
  3. ;==============================================================================
  4. .386p
  5.         PAGE        60,132
  6.         NAME        VSYNC
  7.         TITLE        VSYNC Interrupt
  8. ;==============================================================================
  9. ;    VSYNC 割り込み
  10. ;
  11. ;    CREATE : 1990.06.01
  12. ;    FINISH : 1990.06.02
  13. ;
  14. ;    < High C からの呼出形式 >
  15. ;    extern    int (*VSYNC_entry)() ;
  16. ;    extern    VSYNC_init() ;
  17. ;    extern    VSYNC_end() ;
  18. ;
  19. ;    static int vsync_func1() ;
  20. ;    VSYNC_entry = vsync_func1 ;
  21. ;    VSYNC_init() ;
  22. ;    VSYNC_end();
  23. ;
  24. ;    < note > : TABS = 4
  25. ;
  26. ;    < History >
  27. ;    1990.06.01 : CREATE
  28. ;    1990.08.03 : vsync_release 時のバグ修正
  29. ;    1991.04.13 : 清書
  30. ;
  31. ;    ★注意
  32. ;        このプログラムを呼ぶプログラムの
  33. ;        オブジェクトは、ネイティブの最初に
  34. ;        おいて下さい。(先頭から64K以内に入る
  35. ;        ようにするため。)
  36. ;
  37. ;    Programmed by Y.Hirata ( Nifty-ID : NAB03321 )
  38. ;==============================================================================
  39. ;
  40. INCLUDE    hc.inc                                ;
  41. ;
  42. CGROUP    GROUP pmcode, CODE                    ;
  43. DGROUP    GROUP rmcode, DATA                    ;
  44. ;
  45. ;--------------------------------------------
  46.         public    VSYNC_init                    ; VSYNC 割り込み登録
  47.         public    VSYNC_end                    ; VSYNC 割り込み解除
  48. ;
  49.         public    VSYNC_entry                    ; VSYNC ハンドラ・アドレス(ネイティブ)
  50. ;--------------------------------------------
  51. ;
  52. ;********************************************
  53. ;            定数定義
  54. ;********************************************
  55. ;
  56. INT_NUM        EQU            00Bh                ; IRQ B (オプションボード)
  57. IRQ_0B_ON    EQU            08h                    ; IRQ B 割り込み許可 (11 ビット)
  58. IRQ_0B_OFF    EQU            0F7h                ; IRQ B 割り込み不許可 (11 ビット)
  59. VSYNC_CLR    EQU            05CAh                ; VSYNC割り込み原因クリアレジスタ
  60. ;
  61. ;
  62. ;////////////////////////////////////////////
  63. ;            リアル部
  64. ;////////////////////////////////////////////
  65. ;
  66. rmcode    SEGMENT                                ;
  67.         ASSUME    cs:rmcode                    ;
  68. ;
  69. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  70. ;    ネイティブ-リアルの場合、セグメントレジスタは、 リアルから
  71. ;    ネイティブに戻った場合にネイティブオリジナルの値に
  72. ;    DOS-Extenderが復元してくれるので保存/復元
  73. ;    は省略。
  74. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  75. ;
  76. ;********************************************
  77. ;    VSYNC リアルハンドラ内での使用データ領域
  78. ;********************************************
  79. ;
  80. PROT_entry        DD        ?                    ; リアルモードDOS-Extenderプロシジャアドレス
  81. ;
  82. vsync_flg        DB        0                    ; VSYNC割り込みは許可されているか?
  83. ;
  84. int_mask_data    LABEL    byte                ; 割り込み許可データ
  85.                 DB        ?                    ; ビット 31~24        +0
  86.                 DB        ?                    ; ビット 23~16        +1
  87.                 DB        ?                    ; ビット 15~ 8        +2
  88.                 DB        ?                    ; ビット  7~ 0        +3
  89. ;
  90. vsync_offset    DW        ?                    ; 割り込みデータブロック・オフセット
  91. vsync_segment    DW        ?                    ; 割り込みデータブロック・セグメント
  92. ;
  93. vsync_adrs        DB        0                    ; 割り込みデータブロック..
  94.                 DB        0                    ;
  95.                 DW        OFFSET vsync_hook    ; ハンドラアドレス・オフセット
  96.                 DW        ?                    ; ハンドラアドレス・セグメント
  97. ;
  98. stackOff        DW        0                    ; スタック退避用(ポインタ)
  99. stackSeg        DW        0                    ; スタック退避用(セグメント)
  100. ;
  101.                 DB         512 DUP(0)             ; local stack
  102. tmpRstack        LABEL    byte                ;
  103. ;
  104. ;
  105. ;--------------------------------------------
  106. ;    VSYNC リアルハンドラの登録
  107. ;--------------------------------------------
  108. vsync_setup    PROC    FAR                        ; VSYNCハンドラの登録
  109.             push    ds                        ;
  110.             push    di                        ;
  111.             push    dx                        ;
  112. ;
  113.             mov        ah,1                    ;
  114.             mov        dl,INT_NUM                ; 割り込み要因コード
  115.             int        INT_INT                    ; 割り込みデータブロックアドレスの取り出し
  116. ;
  117.             mov        cs:vsync_offset,di        ; データブロックアドレス・オフセット
  118.             mov        cs:vsync_segment,ds        ; データブロックアドレス・セグメント
  119. ;
  120.             mov        word PTR cs:[vsync_adrs+4],cs
  121.                                             ; VSYNC ハンドラのセグメント
  122.             push    cs                        ;
  123.             pop        ds                        ; ds = cs
  124.             mov        ah,00h                    ;
  125.             mov        dl,INT_NUM                ; 割り込み要因コード
  126.             mov        di,OFFSET vsync_adrs    ;
  127.             int        INT_INT                    ; 割り込みデータブロックアドレスの登録
  128. ;
  129.             mov        ah,3                    ;
  130.             mov        di,OFFSET int_mask_data    ; 割り込み許可データ
  131.             int        INT_INT                    ; 割り込み管理データの取り出し
  132. ;
  133.             mov        cs:vsync_flg,FALSE        ;
  134.             test    byte PTR cs:[di+2],IRQ_0B_ON
  135.             jz        int_enable                ;
  136.             mov        cs:vsync_flg,TRUE        ; VSYNC割り込み許可済
  137. ;
  138. int_enable:                                    ;
  139.             or        byte PTR cs:[di+2],IRQ_0B_ON
  140.                                             ; VSYNC 割り込みの許可
  141.             mov        ah,2                    ;
  142.             int        INT_INT                    ; 割り込み許可データの書き込み
  143. ;
  144.             pop        dx                        ;
  145.             pop        di                        ;
  146.             pop        ds                        ;
  147.             ret                                ;
  148. vsync_setup    ENDP                            ;
  149. ;
  150. ;--------------------------------------------
  151. ;    VSYNC リアルハンドラの登録解除
  152. ;--------------------------------------------
  153. vsync_release    PROC    FAR                    ; VSYNC 解除
  154.             push    ds                        ;
  155.             push    di                        ;
  156.             push    dx                        ;
  157. ;
  158.             push    cs                        ;
  159.             pop        ds                        ; ds = cs
  160.             mov        di,OFFSET int_mask_data    ; 割り込み許可データ
  161.             and     byte PTR cs:[di+2],IRQ_0B_OFF
  162.                                             ; VSYNC 割り込みの禁止
  163.             cmp        cs:vsync_flg,TRUE        ;
  164.             jne        vsync_permission        ;
  165.             or        byte PTR cs:[di+2],IRQ_0B_ON
  166.                                             ; VSYNC 割り込み許可
  167. ;
  168. vsync_permission:                            ;
  169.             mov        ah,2                    ;
  170.             int        INT_INT                    ; 割り込み許可データの書き込み
  171. ;
  172.             mov        ah,0                    ;
  173.             mov        dl,INT_NUM                ; 割り込み要因コード
  174.             lds        di,dword PTR cs:vsync_offset
  175.                                             ; 割り込みデータブロック
  176.             int        INT_INT                    ; 割り込みデータブロックアドレスの登録
  177. ;
  178.             pop        dx                        ;
  179.             pop        di                        ;
  180.             pop        ds                        ;
  181.             ret                                ;
  182. vsync_release    ENDP                        ;
  183. ;
  184. ;--------------------------------------------
  185. ;    VSYNC リアルハンドラ
  186. ;--------------------------------------------
  187. ;    ここから、ネイティブハンドラを呼び出すが、その
  188. ;    時には、ここのスタックが使用されるために、
  189. ;    ローカルスタックを確保しておく必要がある。
  190. ;    (リアルからネイティブを呼び出す時には、かなりの
  191. ;    スタックが呼出し側で必要となるので、注意する
  192. ;    必要がある。)
  193. ;
  194. vsync_hook    PROC    FAR                        ;
  195.             cli                                ;
  196.             mov        word PTR cs:stackSeg,ss    ; スタック退避
  197.             mov        word PTR cs:stackOff,sp    ;
  198. ;
  199.             push    cs                        ;
  200.             pop        ss                        ; ss = cs
  201.             mov        sp,OFFSET tmpRstack        ; ローカルスタック使用
  202. ;
  203.             push    cs                        ;
  204.             pop        ds                        ; ds = cs
  205.             pushad                            ; レジスタ退避
  206. ;
  207.             mov        dx,VSYNC_CLR            ;
  208.             out        dx,al                    ; ダミーライト (VSYNC割り込み原因クリア)
  209. ;
  210.             push    word PTR 0                ;
  211.             push    dword PTR 0                ;
  212.             push    word PTR CODESEG        ;
  213.             push    dword PTR OFFSET VSYNC_handler
  214.                                             ; 呼び出すネイティブルーチンアドレス
  215.             sti                                ;
  216.             call    cs:PROT_entry            ; ネイティブプロシジャの呼出し
  217.             cli                                ;
  218.             add        sp,12                    ;
  219. ;
  220.             popad                            ; レジスタ復帰
  221.             mov        ss,word PTR cs:stackSeg    ; スタックを元に戻す
  222.             mov        sp,word PTR cs:stackOff    ;
  223. ;
  224.             lds        di,dword PTR cs:vsync_offset
  225.                                             ; 本来のVSYNCハンドラに処理を移す
  226.             jmp        dword PTR ds:[di+2]        ; Jump Real Handler
  227. ;
  228. vsync_hook    ENDP                            ;
  229. ;
  230. rmcode        ENDS                            ;
  231. ;
  232. ;
  233. ;////////////////////////////////////////////
  234. ;            ネイティブ部
  235. ;////////////////////////////////////////////
  236. ;
  237. ;********************************************
  238. ;    VSYNC ネイティブハンドラ内での使用データ領域
  239. ;********************************************
  240. ;
  241. DATA    SEGMENT                                ;
  242. ;
  243. REG_esp            DD        0                    ; スタック退避用(ポインタ)
  244. REG_ss            DW        0                    ; スタック退避用(セグメント)
  245. ;
  246.                 DB        32768 DUP (?)        ; ネイティブ・ローカルスタックサイズ(適当)
  247. TmpSTACK         LABEL    byte                ;
  248. ;
  249. DATA    ENDS                                ;
  250. ;
  251. ;
  252. ;********************************************
  253. ;    VSYNC ネイティブ処理
  254. ;********************************************
  255. ;
  256. pmcode    SEGMENT                                ;
  257.         ASSUME    cs:CGROUP, ds:DGROUP        ;
  258. ;
  259. VSYNC_entry        DD        ?                    ; VSYNC ネイティブハンドラ アドレス
  260. ;
  261. ;--------------------------------------------
  262. ;    VSYNC ネイティブハンドラ
  263. ;--------------------------------------------
  264.         ALIGN    4                            ; dword boundary
  265. VSYNC_handler    PROC    FAR                    ;
  266.             cli                                ;
  267.             push    ds                        ;
  268. ;
  269.             mov        ax,DATASEG                ;
  270.             mov        ds,ax                    ;
  271.             mov        word PTR REG_ss,ss        ; スタック退避
  272.             mov        dword PTR REG_esp,esp    ;
  273. ;
  274.             mov        es,ax                    ;
  275.             mov        ss,ax                    ; ss = es = ds
  276.             mov        esp,OFFSET TmpSTACK        ; ローカルスタックの確保
  277.             pushad                            ; レジスタ退避
  278.             sti                                ;
  279. ;
  280.             call    dword PTR cs:VSYNC_entry
  281.                                             ; VSYNC ネイティブハンドラを呼ぶ(HighC用)
  282. ;
  283.             cli                                ;
  284.             popad                            ; レジスタ復帰
  285.             mov        ss,word PTR REG_ss        ; スタックを元に戻す
  286.             mov        esp,dword PTR REG_esp    ;
  287.             pop        ds                        ;
  288.             xor        eax,eax                    ; Return Code = 0
  289.             sti                                ;
  290.             ret                                ;
  291. VSYNC_handler    ENDP                        ;
  292. ;
  293. ;--------------------------------------------
  294. ;    VSYNC 割り込み登録
  295. ;--------------------------------------------
  296.         ALIGN    4                            ; dword boundary
  297. VSYNC_init    PROC    NEAR                    ;
  298.             push    ebp                        ;
  299.             mov        ebp,esp                    ; スタックフレーム形成
  300. ;
  301.             push    es                        ;
  302.             push    ds                        ;
  303.             push    ecx                        ;
  304.             push    ebx                        ;
  305. ;
  306.             mov        ax,0250dh                ;
  307.             int        INT_DOS                    ; リアルモードリンク情報の取得
  308.             mov        PROT_entry,eax            ; リアルモードDOS-Extenderプロシジャアドレス
  309.                                             ; リアル から ネイティブ を call するため
  310.                                             ; の処理。
  311. ;
  312.             push    ds                        ;
  313.             pop        es                        ; es = ds
  314.             xor        ebx,ebx                    ;
  315.             lea        ecx,_realend            ;
  316.             mov        ax,0250fh                ;
  317.             int        INT_DOS                    ; ネイティブ->リアル の アドレス変換
  318. ;
  319.             mov        ebx,ecx                    ; セグメント
  320.             lea        bx,vsync_setup            ; オフセット
  321.             xor        ecx,ecx                    ; ecx = 0
  322.             mov        ax,0250eh                ;
  323.             int        INT_DOS                    ; リアルモードプロシジャの呼出
  324. ;
  325.             pop        ebx                        ;
  326.             pop        ecx                        ;
  327.             pop        ds                        ;
  328.             pop        es                        ;
  329.             xor        eax,eax                    ; return code = 0
  330. ;
  331.             pop        ebp                        ; スタックフレーム開放
  332.             ret                                ;
  333. VSYNC_init    ENDP                            ;
  334. ;
  335. ;--------------------------------------------
  336. ;    VSYNC 割り込み解除
  337. ;--------------------------------------------
  338.         ALIGN    4                            ; dword boundary
  339. VSYNC_end    PROC    NEAR                    ;
  340.             push    ebp                        ;
  341.             mov        ebp,esp                    ; スタックフレーム形成
  342. ;
  343.             push    es                        ;
  344.             push    ds                        ;
  345.             push    ecx                        ;
  346.             push    ebx                        ;
  347. ;
  348.             push    ds                        ;
  349.             pop        es                        ; es = ds
  350.             xor        ebx,ebx                    ;
  351.             lea        ecx,_realend            ;
  352.             mov        ax,0250fh                ;
  353.             int        INT_DOS                    ; ネイティブ->リアル の アドレス変換
  354. ;
  355.             mov        ebx,ecx                    ; セグメント
  356.             lea        bx,vsync_release        ; オフセット
  357.             xor        ecx,ecx                    ; ecx = 0
  358.             mov        ax,0250eh                ;
  359.             int        INT_DOS                    ; リアルモードプロシジャの呼出
  360. ;
  361.             pop        ebx                        ;
  362.             pop        ecx                        ;
  363.             pop        ds                        ;
  364.             pop        es                        ;
  365.             xor        eax,eax                    ; return code = 0
  366. ;
  367.             pop        ebp                        ; スタックフレーム開放
  368.             ret                                ;
  369. VSYNC_end    ENDP                            ;
  370. ;
  371. pmcode        ENDS                            ;
  372. ;
  373.         END
  374.     
  375.